package pe.gob.osce.sirenas.dao.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.Column;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import pe.gob.osce.sirenas.dao.HistorialEstadoDAOLocal;
import pe.gob.osce.sirenas.dao.convert.HistorialEstadoConvert;
import pe.gob.osce.sirenas.model.AcreditacionDTO;
import pe.gob.osce.sirenas.model.HistorialEstadoDTO;
import pe.gob.osce.sirenas.model.jpa.Auditoria;
import pe.gob.osce.sirenas.model.jpa.Domicilio;
import pe.gob.osce.sirenas.model.jpa.HistorialEstado;
import pe.gob.osce.sirenas.util.ConstanteEJB;
import pe.gob.osce.sirenas.util.ModeloException;


@Stateless
public class HistorialEstadoDAOImpl implements HistorialEstadoDAOLocal {

	@PersistenceContext(unitName="pe.gob.osce.sirenas.be.pu" )
	private	EntityManager	em;
	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteEJB.PROPERTIES);

	@Override 
	public List<HistorialEstadoDTO> listarHistorialEstados(Long idFicha) throws Exception{

		List<HistorialEstadoDTO> listHistorialEstadoDTO=null;
		List<HistorialEstado> listaHistorialEstadoJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
						
			jpql.append("SELECT ac FROM HistorialEstado ac WHERE ac.estado= 1");
			if(idFicha!=null){
				jpql.append(" AND ac.idFicha = :idFicha");
			}
			
			Query	query= em.createQuery( jpql.toString() );
			if(idFicha!=null){
				query.setParameter("idFicha", idFicha);
			}
			
			List<HistorialEstado>	listaObjeto= query.getResultList();
			
			if(!listaObjeto.isEmpty()) {
				listaHistorialEstadoJPA=new ArrayList<HistorialEstado>();
				for (HistorialEstado obj: listaObjeto) {					
					listaHistorialEstadoJPA.add(obj);
				}
				listHistorialEstadoDTO=HistorialEstadoConvert.createListaHisEstadoDTO(listaHistorialEstadoJPA);
			}
			
		} catch (NoResultException nre) {
			listHistorialEstadoDTO=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listHistorialEstadoDTO;
	}

	@Override 
	public HistorialEstado obtenerHistorialEstado(Long idHistEstado) throws Exception{

		HistorialEstado historialEstadoJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();

			jpql.append("SELECT ac FROM HistorialEstado ac WHERE ac.idHistEstado = :idHistEstado");

			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idHistEstado", idHistEstado);
			historialEstadoJPA= (HistorialEstado)query.getSingleResult();
		
		} catch (NoResultException nre) {
			historialEstadoJPA=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return historialEstadoJPA;
	}
	
	
	@Override
	public HistorialEstado insertHistorialEstado(HistorialEstado acreditacion) throws Exception {
		try{
			em.merge(acreditacion);
			em.flush();
		} catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}
		return acreditacion;
	}
	
	

	@Override
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void inacticaHistorialEstado(Long idFicha, String codUsuario) throws Exception {
		try{
			StringBuilder          jpql= new StringBuilder();
			
            jpql.append(" UPDATE HistorialEstado d ");
            jpql.append(" SET d.indVigente = :indVigente ");
            jpql.append(" ,d.auditoria.fechaModifica = :fechaModifica ");
            jpql.append(" ,d.auditoria.usuarioModifica = :usuarioModifica ");
            jpql.append(" WHERE d.idFicha = :idFicha ");
			
			Query query= em.createQuery( jpql.toString() );

			query.setParameter("indVigente", false);
			query.setParameter("fechaModifica", new Date());
			query.setParameter("usuarioModifica", codUsuario);
			query.setParameter("idFicha", idFicha);
			        
			query.executeUpdate();

		} catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}
	}
}
